在前一章「04. 怎麼用 Vagrant 練習 Ansible?」我們是使用 Virtualbox + Vagrant 的組合來練習 Ansible,這次凍仁將會改用當前最火紅的 Docker 虛擬化容器技術來建置虛擬環境。
Docker 的好凍仁在此就不多談,大家若對 Docker 還不熟悉,可以看看凍仁以前分享過的「前端工程師一定要知道的 Docker 虛擬化容器技巧」簡報,這是一份讓人快速上手 Docker 的教學。
請安裝最新版的 Docker 即可。這裡凍仁將不會特別介紹怎麼安裝,請參考以下文章。
凍仁已在 Docker Hub 上建好了 Managed Node 的 Docker image - chusiang/ansible-managed-node
以利大家練習 Ansible,該專案目前支援的 Linux 發行版本有:
alpine-3.4
(End-of-life, EOL)alpine-3.6
, latest
archlinux
centos-6
centos-7
debian-7
debian-8
gentoo
(EOL)opensuse-42.1
(EOL)opensuse-42.2
opensuse-42.3
ubuntu-14.04
ubuntu-16.04
底下將列出本次主題所會用到的相關指令,練習時只需執行步驟 1, 2, 3 即可。
取得凍仁事先建立好的 Docker image。
$ docker pull chusiang/ansible-managed-node:ubuntu-14.04
#### 使用者帳戶 #####################
#
# | | username | password |
# |-----------|----------|----------|
# | root user | root | root |
# | sudo user | docker | docker |
建立並執行容器。
$ docker run --name server1 -d -P chusiang/ansible-managed-node:ubuntu-14.04
ecdf39055ba2a932fa8c76a75afdec1cd8f516285bee6f4e07c16c67f4009211
觀看容器狀態和 SSH 綁定的埠口 (Port)。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ecdf39055ba2 chusiang/ansible-managed-node:ubuntu-14.04 "/usr/sbin/sshd -D" 20 hours ago Up 17 seconds 0.0.0.0:32805->22/tcp server1
進入容器。
$ docker exec -it server1 bash
關閉容器。
$ docker stop server1
啟用容器。
$ docker start server1
移除容器。
$ docker rm server1
# -f, --force: 強制移除,包含正在執行的容器。
接下來,我們將會用 Ansible 來控制 Docker 在本機上建立的容器,其作業系統版本為 Ubuntu 14.04 64-bit (AMD64),大家可以從 Dockerfile [^1] 看到裡面已預載了 OpenSSH server 和 Python。
取得容器的 OpenSSH 設定:請特別留意 0.0.0.0:32805->22/tcp
的值。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ecdf39055ba2 chusiang/ansible-managed-node:ubuntu-14.04 "/usr/sbin/sshd -D" 20 hours ago Up 17 seconds 0.0.0.0:32805->22/tcp server1
設定 ansible.cfg:將 remote_user
設為 docker
。
$ vi ansible.cfg
[defaults]
inventory = hosts
remote_user = docker
host_key_checking = False
設定 hosts。
$ vi hosts
server1 ansible_ssh_host=127.0.0.1 ansible_ssh_port=32805 ansible_ssh_pass=docker
[local]
server1
ansible_ssh_host
:請設為本機的 IP。
ansible_ssh_port
:請設為 docker ps
時取得的 SSH port。
ansible_ssh_pass
:因沒有連線用的 SSH 金鑰,故直接使用密碼的方式進行連線,建議只於練習環境使用該參數。
當已上的設置都完成了,我們就可以在終端機裡用 Docker 建立好的容器來練習 Ansible 了!
$ ansible all -m command -a 'echo Hello World on Docker.'
server1 | SUCCESS | rc=0 >>
Hello World on Docker.
就實務面而言,凍仁一般會先在 Vagrant 的虛擬環境先開發好 Ansible Playbooks,有 Dockerize 需求再來相容 Docker 的環境。
Vagrant 利於開發,而 Docker 利於散佈、部署和節省資源,要怎麼搭配使用就看個人的習慣了。
[^1]: chusiang/ansible-managed-node:ubuntu-14.04
image 的 Dockerfile 可以在凍仁的 GitHub 找到,其網址為 https://github.com/chusiang/ansible-managed-node.dockerfile/blob/master/ubuntu-14.04/Dockerfile 。